package br.com.beyondclick.controller;

import static br.com.gentech.commons.model.repository.QueryParameter.with;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import net.sourceforge.stripes.action.DefaultHandler;
import net.sourceforge.stripes.action.ForwardResolution;
import net.sourceforge.stripes.action.Resolution;
import net.sourceforge.stripes.validation.Validate;
import net.sourceforge.stripes.validation.ValidateNestedProperties;
import br.com.beyondclick.model.entity.Cheque;
import br.com.beyondclick.model.entity.Cheque.Cheques;
import br.com.gentech.commons.controller.DefaultCRUDActionBean;
import br.com.gentech.commons.model.repository.Repository;

import com.samaxes.stripejb3.EJBBean;

/**
 * @author AC de Souza
 */
public class ChequeActionBean extends DefaultCRUDActionBean<Cheque, Long> {

	@ValidateNestedProperties({
		@Validate(field="numero", required=true, on="gravar"),
		@Validate(field="valor", required=true, minvalue=0.01, on="gravar")
	})
	private Cheque entidade;
	@Override
	public Cheque getEntidade() { return entidade; }
	public void setEntidade(Cheque entidade){ this.entidade = entidade; }

	@EJBBean("RepositoryBean")
	private Repository<Cheque, Long> chequeRepository;
	public Repository<Cheque, Long> getRepository(){ return chequeRepository;	}

	private Date inicio;
	@Validate(field="inicio", required=true, on="buscar")
	public Date getInicio() { return inicio; }
	public void setInicio(Date inicio) { this.inicio = inicio; }

	private Date fim;
	@Validate(field="fim", required=true, on="buscar")
	public Date getFim() { return fim; }
	public void setFim(Date fim) { this.fim = fim; }
	

	private List<Cheque> cheques;
	public List<Cheque> getCheques() { return cheques; }
	public void setCheques(List<Cheque> cheques) { this.cheques = cheques; }

	/**
	 * Executar a busca padrão, que usa o primeiro e último, dia do mês corrente como parâmetro de inicio e fim.
	 * 
	 * @return
	 */
	@Override
    @DefaultHandler
	public Resolution listar() {
		Calendar cal = Calendar.getInstance();
		cal.setTime(new Date());
		
		cal.set(Calendar.DAY_OF_MONTH, 1);
		inicio = cal.getTime();

		cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
		fim = cal.getTime();
		return buscar();
	}

	private BigDecimal totalCheques;
	public BigDecimal getTotalCheques() { return totalCheques; }
	public void setTotalCheques(BigDecimal totalCheques) { this.totalCheques = totalCheques; }

	public Resolution buscar() {
		cheques = chequeRepository.findWithNamedQuery(Cheques.findPorPeriodoOrdenadoPorEmissao,
														with("inicio", inicio).
														and("fim", fim).parameters()
													);
		totalCheques = new BigDecimal(BigInteger.ZERO, 2);
		for (Cheque cheque : cheques) {
			totalCheques = totalCheques.add( cheque.getValor() );
		}
		
		return new ForwardResolution( getPAGINA_LISTAR() );
	}
}